/***************************************************************
 * Name:      EditeurDessinMain.cpp
 * Purpose:   Code for Application frame
 * Author:    QUEYROI-RAMA ()
 * Created:   2010-01-05
 * Copyright: QUEYROI-RAMA ()
 * License:
 **************************************************************/

#ifdef WX_PRECOMP
#include "wx_pch.h"
#endif

#ifdef __BORLANDC__
#pragma hdrstop
#endif //__BORLANDC__

#include "EditeurDessinMain.h"
#include "ZoneDeDessin.h"
#include <iostream>
//helper functions
enum wxbuildinfoformat {
    short_f, long_f };

wxString wxbuildinfo(wxbuildinfoformat format)
{
    wxString wxbuild(wxVERSION_STRING);

    if (format == long_f )
    {
#if defined(__WXMSW__)
        wxbuild << _T("-Windows");
#elif defined(__WXMAC__)
        wxbuild << _T("-Mac");
#elif defined(__UNIX__)
        wxbuild << _T("-Linux");
#endif

#if wxUSE_UNICODE
        wxbuild << _T("-Unicode build");
#else
        wxbuild << _T("-ANSI build");
#endif // wxUSE_UNICODE
    }

    return wxbuild;
}


BEGIN_EVENT_TABLE(EditeurDessinMain, wxFrame)
    EVT_MENU(wxID_EXIT, EditeurDessinMain::OnQuit)
    EVT_MENU(wxID_ABOUT,EditeurDessinMain::OnAbout)
    EVT_CLOSE(EditeurDessinMain::OnClose)
END_EVENT_TABLE()

EditeurDessinMain::EditeurDessinMain(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size)
    : wxFrame(parent,id,title,pos,size)
{

    creationMenu();
    creationZoneDeDessin();
}


EditeurDessinMain::~EditeurDessinMain()
{
}

void EditeurDessinMain::OnClose(wxCloseEvent &event)
{
    Destroy();
}

void EditeurDessinMain::OnQuit(wxCommandEvent &event)
{
    Destroy();
}

void EditeurDessinMain::OnAbout(wxCommandEvent &event)
{
     wxString message = _T("QUEYROI-RAMA ENSAI 2010 \nInfo Machine : ");
     message << wxbuildinfo(long_f);

     wxMessageBox(message, _T("Editeur Dessin "));

}

void EditeurDessinMain::creationMenu()
{
   //Bar de menu
    barreMenu = new wxMenuBar();
    //Creation du menu Fichier
    menuFichier = new wxMenu();
    menuFichier->Append(wxID_OPEN, _T("&Ouvrir"));
    menuFichier->Append(wxID_SAVE, _T("&Enregistrer"));
    menuFichier->AppendSeparator();
    menuFichier->Append(wxID_EXIT, _T("&Quitter"));

    barreMenu->Append(menuFichier, _T("&Fichier"));

    //Creation du menu Aide
    menuAide = new wxMenu();
    menuAide->Append(wxID_ABOUT, _T("&A propos"));

    barreMenu->Append(menuAide, _T("&Aide"));

    SetMenuBar(barreMenu);



}

void EditeurDessinMain::creationZoneDeDessin(){

    //Conteneur

	wxPanel *conteneur = new wxPanel(this,-1) ;

	//Zone de dessin (dans la fenetre), Panel de Gauche(Selection forme) et Panel de Droite(Selection Couleur)

        zoneDeDessin = new ZoneDeDessin(conteneur, -1) ;
	//wxBoxSizer * sizerZoneDessin = new wxBoxSizer(wxVERTICAL) ;
    //sizerZoneDessin -> Add(zoneDeDessin,wxHORIZONTAL) ;
	//sizerZoneDessin -> SetSizeHints(this);

	wxPanel *controleGauche = new wxPanel (conteneur,-1) ;
	controleGauche -> SetClientSize(150,600);
	controleGauche ->SetBackgroundColour (wxColor (_T("Grey"))) ;


	wxPanel *controleDroite = new wxPanel (conteneur,-1) ;
	controleDroite -> SetClientSize(150,600);
	controleDroite ->SetBackgroundColour (wxColor (_T("Grey"))) ;




	// 3 colonnes
	wxBoxSizer * box = new wxBoxSizer (wxHORIZONTAL) ;

	box->Add(controleGauche,0,wxEXPAND,0) ;
	box->Add(zoneDeDessin,1,wxEXPAND,1);
	box->Add(controleDroite,0,wxEXPAND,0);

	wxBoxSizer * grosConteneur = new wxBoxSizer(wxHORIZONTAL) ;
	grosConteneur -> Add(box) ;

    //Boutons
	wxBoxSizer * sizerBoutonsCouleurs = new wxBoxSizer (wxVERTICAL) ;
    wxBoxSizer * sizerBoutonsDessins = new wxBoxSizer (wxVERTICAL) ;

	controleDroite -> SetSizer(sizerBoutonsCouleurs) ;
    controleGauche->SetSizer(sizerBoutonsDessins);

		//Rouge

	wxButton * rouge = new wxButton (controleDroite, -1, wxT ("Rouge")) ;
	sizerBoutonsCouleurs -> Add(rouge,0,wxALIGN_CENTER_HORIZONTAL);
	Connect (rouge->GetId (), wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &EditeurDessinMain::ChoixCouleurRouge) ;

		//Vert


	wxButton * vert = new wxButton (controleDroite, -1, wxT ("Vert")) ;
	sizerBoutonsCouleurs -> Add(vert,0,wxALIGN_CENTER_HORIZONTAL);
    Connect (vert->GetId (), wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &EditeurDessinMain::ChoixCouleurVert) ;

		//Bleu

	wxButton * bleu = new wxButton (controleDroite, -1, wxT ("Bleu")) ;
	sizerBoutonsCouleurs -> Add(bleu,0,wxALIGN_CENTER_HORIZONTAL);
    Connect (bleu->GetId (), wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &EditeurDessinMain::ChoixCouleurBleu) ;

		//Rectangle
    wxButton* b_rectangle = new wxButton(controleGauche,-1,wxT("Rectangle"));
    sizerBoutonsDessins-> Add(b_rectangle,0,wxALIGN_CENTER_HORIZONTAL);
    Connect(b_rectangle->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &EditeurDessinMain::ChoixDessinRectangle);

		//Ellipse
    wxButton* b_ellipse = new wxButton(controleGauche,-1,wxT("Ellipse"));
    sizerBoutonsDessins-> Add(b_ellipse,0,wxALIGN_CENTER_HORIZONTAL);
    Connect(b_ellipse->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &EditeurDessinMain::ChoixDessinEllipse);

		// Boutons Action dessins
		//Grab
   wxButton* b_grab = new wxButton(controleGauche,-1,wxT("Deplacer"));
   sizerBoutonsDessins-> Add(b_grab,0,wxALIGN_CENTER_HORIZONTAL);
   Connect(b_grab->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &EditeurDessinMain::ChoixActionDessinGrab);

            //Resize
   wxButton* b_resize = new wxButton(controleGauche,-1,wxT("Redimensionner"));
   sizerBoutonsDessins-> Add(b_resize,0,wxALIGN_CENTER_HORIZONTAL);
   Connect(b_resize->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &EditeurDessinMain::ChoixActionDessinResize);

            //Lancer
  wxButton* b_lancer = new wxButton(controleGauche,-1,wxT("Lancer"));
  sizerBoutonsDessins-> Add(b_lancer,0,wxALIGN_CENTER_HORIZONTAL);
  Connect(b_lancer->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &EditeurDessinMain::ChoixActionDessinLancer);


  //Initialisation ZoneDeDessin
  zoneDeDessin->setCreateurCouleur(new CreateurRouge());
  zoneDeDessin->setCreateurDessin(new CreateurRectangle());

  //Panel etat dessin select

    etat = new DessinSelectObserver(controleDroite) ;
  	etat -> SetBackgroundColour(wxColor (_T("White")));
  	etat -> SetClientSize(50,50) ;

        zoneDeDessin->addObserver(etat);

  	sizerBoutonsDessins->Add(etat, 0, wxALIGN_CENTER_HORIZONTAL) ;



	grosConteneur -> SetSizeHints(this) ;
	conteneur->SetSizer(box) ;



	//Barre d'etat
        CreateStatusBar(3);
        SetStatusText(wxT("Action"), 0);
        SetStatusText(wxT("Forme"), 1);
        SetStatusText(wxT("Couleur"), 2);

}

void EditeurDessinMain::ChoixCouleurRouge (wxCommandEvent& event){
                zoneDeDessin -> setCreateurCouleur(new CreateurRouge());
                //etat -> SetBackgroundColour(wxColor (_T("Red"))) ;
                SetStatusText(wxT("Rouge"), 2);
}

void EditeurDessinMain::ChoixCouleurVert(wxCommandEvent& event){
                zoneDeDessin -> setCreateurCouleur(new CreateurVert());
                //etat -> SetBackgroundColour(wxColor (_T("Green"))) ;
                SetStatusText(wxT("Vert"), 2);
}

void EditeurDessinMain::ChoixCouleurBleu(wxCommandEvent& event){
                zoneDeDessin -> setCreateurCouleur(new CreateurBleu());
                //etat -> SetBackgroundColour(wxColor (_T("Blue"))) ;
                SetStatusText(wxT("Bleu"), 2);
}

void EditeurDessinMain::ChoixDessinRectangle(wxCommandEvent& event){
    zoneDeDessin->setCreateurDessin(new CreateurRectangle());
    SetStatusText(wxT("Rectangle"), 1);
}

void EditeurDessinMain::ChoixDessinEllipse(wxCommandEvent& event){
    zoneDeDessin->setCreateurDessin(new CreateurEllipse());
    SetStatusText(wxT("Ellipse"), 1);
}

void EditeurDessinMain::ChoixActionDessinGrab(wxCommandEvent& event){
    if(!(zoneDeDessin->GetChildren()).IsEmpty()){
        wxNode *node = (wxNode*)  (zoneDeDessin->GetChildren()).GetFirst();
        while (node){
           ((Dessin*) node->GetData())->setActionDessin(new ActionDessinGrab());
            node = (wxNode*) node->GetNext();
        }
        SetStatusText(wxT("Deplacement"), 0);
    }
}

void EditeurDessinMain::ChoixActionDessinResize(wxCommandEvent& event){

    if(!(zoneDeDessin->GetChildren()).IsEmpty()){

        wxNode *node = (wxNode*) (zoneDeDessin->GetChildren()).GetFirst();
        while (node){

           ((Dessin*) node->GetData())->setActionDessin(new ActionDessinResize());
            node = (wxNode*) node->GetNext();
        }
        SetStatusText(wxT("Redimensionnement"), 0);
    }
}

void EditeurDessinMain::ChoixActionDessinLancer(wxCommandEvent& event){

    if(!(zoneDeDessin->GetChildren()).IsEmpty()){

        wxNode *node = (wxNode*) (zoneDeDessin->GetChildren()).GetFirst();
        while (node){
           ((Dessin*) node->GetData())->setActionDessin(new ActionDessinGrabToLauch());
            node = (wxNode*) node->GetNext();
        }
        SetStatusText(wxT("Lancement"), 0);
    }
}

void EditeurDessinMain::OnTimer(wxTimerEvent &event){
       if(!(zoneDeDessin->GetChildren()).IsEmpty()){
        wxNode *node = (wxNode*) (zoneDeDessin->GetChildren()).GetFirst();
        while (node){
           ((Dessin*) node->GetData())->OnTimer(event);
            node = (wxNode*) node->GetNext();
        }
    }
}
